/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package camada.bancodedados.daoimplemente.agenda;

import camada.bancodedados.conexao.Conexao;
import camada.bancodedados.daoimplemente.cliente.PessoaFisicaDAOImpl;
import camada.negocio.dao.agenda.AgendaDAO;
import com.mysql.jdbc.PreparedStatement;
import eloma.classe.Cliente;
import eloma.classe.agenda.AgendaAtividade;
import eloma.classe.agenda.AgendaDia;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import utilitarios.Exceptions;

/**
 *
 * @author Icaro
 */
public class AgendaDAOImpl implements AgendaDAO {

    Exceptions exception = new Exceptions();
    PessoaFisicaDAOImpl daoCliente = new PessoaFisicaDAOImpl();

    @Override
    //<editor-fold desc="inserirCheque">
    public void inserirAgenda(AgendaDia agenda) {
        Calendar c = Calendar.getInstance();
        PreparedStatement pstm = null;
        try {
            final String SQL_INSERT
                    = "insert into Agenda_Dia (data,dia,mes_cadastro) values (?,?,?)";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_INSERT);
            pstm.setString(1, agenda.getData());
            pstm.setString(2, agenda.getDia());
            pstm.setInt(3, c.get(Calendar.MONTH) + 1);
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "SaidaChequesDAOImpl - inserirSaidaCheques");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="inserirAgendaAtividade">
    public void inserirAgendaAtividade(AgendaAtividade agenda) {
        PreparedStatement pstm = null;
        try {
            final String SQL_INSERT
                    = "insert into Agenda_Atividade (idAgendaDia,idCliente,descricao,situacao) values (?,?,?,?)";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_INSERT);
            pstm.setInt(1, agenda.getAgendaDia().getIdAgendaDia());
            pstm.setInt(2, agenda.getCliente().getIdCliente());
            pstm.setString(3, agenda.getDescricao());

            if (agenda.isSituacao() == true) {
                pstm.setInt(4, 1);
            } else {
                pstm.setInt(4, 2);
            }
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "SaidaChequesDAOImpl - inserirSaidaCheques");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="atualizarCheque">
    public void atualizarAgenda(AgendaDia agenda) {
        PreparedStatement pstm = null;
        try {
            final String SQL_UPDATE
                    = "UPDATE Agenda_Dia SET data = ?, dia = ? where idAgendaDia = ? ";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_UPDATE);
            pstm.setString(1, agenda.getData());
            pstm.setString(2, agenda.getDia());
            pstm.setInt(3, agenda.getIdAgendaDia());
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "SaidaChequesDAOImpl - atualizarSaidaCheques");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="atualizarCheque">
    public void atualizarAgendaAtividade(AgendaAtividade agenda) {
        PreparedStatement pstm = null;
        try {
            final String SQL_UPDATE
                    = "UPDATE Agenda_Atividade SET idAgendaDia = ?,idCliente = ?,descricao = ?,situacao = ? where idAgendaAtividade = ? ";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_UPDATE);
            pstm.setInt(1, agenda.getAgendaDia().getIdAgendaDia());
            pstm.setInt(2, agenda.getCliente().getIdCliente());
            pstm.setString(3, agenda.getDescricao());

            if (agenda.isSituacao() == true) {
                pstm.setInt(4, 1);
            } else {
                pstm.setInt(4, 2);
            }

            pstm.setInt(5, agenda.getIdAgendaAtividade());
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "SaidaChequesDAOImpl - atualizarSaidaCheques");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="atualizarCheque">
    public void atualizarSituacaoAgendaAtividade(AgendaAtividade agenda) {
        PreparedStatement pstm = null;
        try {
            final String SQL_UPDATE
                    = "UPDATE Agenda_Atividade SET situacao = ? where idAgendaAtividade = ? ";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_UPDATE);
            if (agenda.isSituacao() == true) {
                pstm.setInt(1, 1);
            } else {
                pstm.setInt(1, 2);
            }

            pstm.setInt(2, agenda.getIdAgendaAtividade());
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "SaidaChequesDAOImpl - atualizarSaidaCheques");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="removerCheque">
    public void removerAgenda(int idAgendaDia) {
        PreparedStatement pstm = null;
        try {
            final String SQL_DELETE = "delete from Agenda_Dia where idAgendaDia = ?";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_DELETE);
            pstm.setInt(1, idAgendaDia);
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "SaidaChequesDAOImpl - removerSaidaCheques");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="removerCheque">
    public void removerAgendaAtividade(int idAgendaAtividade) {
        PreparedStatement pstm = null;
        try {
            final String SQL_DELETE = "delete from Agenda_Atividade where idAgendaAtividade = ?";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_DELETE);
            pstm.setInt(1, idAgendaAtividade);
            pstm.executeUpdate();
        } catch (SQLException e) {
            exception.Exceptions(e.getMessage().toString(), "SaidaChequesDAOImpl - removerSaidaCheques");
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="selecionarChequeDoMes">
    public List<AgendaDia> selecionarAgenda() throws Exception {
        Calendar c = Calendar.getInstance();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String SELECT_SAIDACHEQUE = "Select * from Agenda_Dia Where mes_cadastro = ?";
        try {
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SELECT_SAIDACHEQUE);
            stmt.setInt(1, c.get(Calendar.MONTH) + 1);
            rs = stmt.executeQuery();
            return carregarVariosResultados(rs);
        } catch (SQLException sqle) {
            exception.Exceptions(sqle.getMessage().toString(), "SaidaChequesDAOImpl - selecionarSaidaChequesAbertosBaixadosPorAnoEMes");
            throw new Exception(sqle);
        } catch (Exception e) {
            exception.Exceptions(e.getMessage().toString(), "SaidaChequesDAOImpl - selecionarSaidaChequesAbertosBaixadosPorAnoEMes");
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="selecionarChequeDoMes">
    public List<AgendaAtividade> selecionarAgendaAtividade() throws Exception {
        Calendar c = Calendar.getInstance();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String SELECT_SAIDACHEQUE = "Select * from Agenda_Atividade";
        try {
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SELECT_SAIDACHEQUE);
            rs = stmt.executeQuery();
            return carregarVariosResultadosAgendaAtividade(rs);
        } catch (SQLException sqle) {
            exception.Exceptions(sqle.getMessage().toString(), "SaidaChequesDAOImpl - selecionarSaidaChequesAbertosBaixadosPorAnoEMes");
            throw new Exception(sqle);
        } catch (Exception e) {
            exception.Exceptions(e.getMessage().toString(), "SaidaChequesDAOImpl - selecionarSaidaChequesAbertosBaixadosPorAnoEMes");
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="selecionarChequeDoMes">
    public List<AgendaAtividade> selecionarAgendaAtividadePorIdAgendaDia(int idAgendaDia) throws Exception {
        Calendar c = Calendar.getInstance();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String SELECT_SAIDACHEQUE = "Select * from Agenda_Atividade Where idAgendaDia = ?";
        try {
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SELECT_SAIDACHEQUE);
            stmt.setInt(1, idAgendaDia);
            rs = stmt.executeQuery();
            return carregarVariosResultadosAgendaAtividade(rs);
        } catch (SQLException sqle) {
            exception.Exceptions(sqle.getMessage().toString(), "SaidaChequesDAOImpl - selecionarSaidaChequesAbertosBaixadosPorAnoEMes");
            throw new Exception(sqle);
        } catch (Exception e) {
            exception.Exceptions(e.getMessage().toString(), "SaidaChequesDAOImpl - selecionarSaidaChequesAbertosBaixadosPorAnoEMes");
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    @Override
    public AgendaDia pesquisaAgendaDiaPorData(String data) throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            final String SQL_PESQUISA_USUARIO = "select * from Agenda_Dia where data = ?";
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_PESQUISA_USUARIO);
            stmt.setString(1, data);
            rs = stmt.executeQuery();
            return carregarSimpleResultado(rs);
        } catch (SQLException sqle) {
            throw new Exception(sqle);
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
        }
    }

    @Override
    public AgendaDia pesquisaAgendaDiaPorIdentificador(int idAgendaDia) throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            final String SQL_PESQUISA_USUARIO = "select * from Agenda_Dia where idAgendaDia = ?";
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_PESQUISA_USUARIO);
            stmt.setInt(1, idAgendaDia);
            rs = stmt.executeQuery();
            return carregarSimpleResultado(rs);
        } catch (SQLException sqle) {
            throw new Exception(sqle);
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
        }
    }

    //<editor-fold desc="Metódos para carregar listas">
    public List<AgendaDia> carregarVariosResultados(ResultSet rs) throws SQLException {
        List<AgendaDia> resultList = new ArrayList<AgendaDia>();
        while (rs.next()) {
            AgendaDia dto = new AgendaDia();
            carregarVO(dto, rs);
            resultList.add(dto);
        }
        return resultList;
    }

    private AgendaDia carregarSimpleResultado(ResultSet rs) throws SQLException {
        if (rs.next()) {
            AgendaDia dto = new AgendaDia();
            carregarVO(dto, rs);
            return dto;
        } else {
            return null;
        }
    }

    private void carregarVO(AgendaDia dto, ResultSet rs) throws SQLException {
        dto.setIdAgendaDia(rs.getInt("IdAgendaDia"));
        dto.setData(rs.getString("data"));
        dto.setDia(rs.getString("Dia"));
    }
    //</editor-fold>

    private List<AgendaAtividade> carregarVariosResultadosAgendaAtividade(ResultSet rs) throws SQLException {
        List<AgendaAtividade> resultList = new ArrayList<AgendaAtividade>();
        while (rs.next()) {
            AgendaAtividade dto = new AgendaAtividade();
            carregarAtividadeVO(dto, rs);
            resultList.add(dto);
        }
        return resultList;
    }

    private void carregarAtividadeVO(AgendaAtividade dto, ResultSet rs) throws SQLException {
        try {

            dto.setIdAgendaAtividade(rs.getInt("IdAgendaAtividade"));

            Cliente cliente = daoCliente.buscaId(rs.getInt("IdCliente"));
            dto.setCliente(cliente);

            AgendaDia agendaDia = pesquisaAgendaDiaPorIdentificador(rs.getInt("IdAgendaDia"));
            dto.setAgendaDia(agendaDia);

            dto.setDescricao(rs.getString("descricao"));
            int situacao = rs.getInt("situacao");

            if (situacao == 1) {
                dto.setSituacao(true);
            } else {
                dto.setSituacao(false);
            }

        } catch (Exception e) {

        }
    }
}
